- web6047 - (2021/09/10(金) 現在、システム調整中のため、一部の表示がおかしいかもしれません)

homepage6047 2019年 9月

プログラミングやRPG(作るほう)が好きな人の日記



このホームページは毎日 夜11時にアクセスできなくなります。

朝6時半に再開されます。(世の中のネット依存対策として)


2019/10/13(日)

DRAM記事について -[dram]

DRAM の記事 について、すべての図を修正しました。

図が大量だったので疲れました…

それから、最終的な完成写真と、その回路図、動画も作成して掲載してあるので、興味のある方はご覧ください。 ここ


2019/10/6 (日)

DRAM記事について -[dram]

DRAM の記事について、完成写真を新しいものに変更し、動画も付けました。 ここ

DRAM 回路を自分でも作ってみようと取り組んでいる方のための取り急ぎの連絡事項、 ここ

DRAM が思った通りに動かず、3日間くらいずっと試行錯誤していたので、説明のほうは進んでいません。

試行錯誤は幸運にも解決し、ちゃんと最終的な完成に至ったと思います。


10月のページを作らないとな…


2019/9/25(水)

NO PC WEEK -[no_pc]

9/26(木)から10/3(木)まで、NO PC WEEK とします。

10/10(木)まで延長することも考えています。

そのあいだホームページの更新はなく、フォームなどの返信等もできません。


今月の扉絵または扉スクリプト

今月は久しぶりにスクリプトをページの最初に飾っています。

「よくある 2D の星の接近アニメーション」と思わせておいて、「実は 3D で回転するぞ」というサプライズ(驚き)を意図して作りました。

「イース1」というゲームソフトでエンディングをむかえてスタッフロールが流れるとき、その背景で星が画面中央から拡散するようにアニメーションします。それと似たような画面を今回最初に表示しています。

スクリプトで下図のようなことをやっています。


途中のメッセージで「回転、回転」と言っているのは、図中のカメラの回転のことです。

星は常に、同じ方向へ流れているか止まっているかのどちらかの動きしかしていません。

スクリプトのソースコード (コントでプログラムの案内をしています)


2019/9/1(日)

お盆休み中の勉強

2019/8/7に、

みなさんも、お盆休みに暇ならば、前から取り組もうと思っていたものを根詰めて勉強してみるとか、絵の苦手なところの練習とかでもいいと思うんですが、何かしらやってみてはどうでしょう。

と私が言っていたので、私自身のお盆休み中の勉強の結果をお知らせしておきます。

「Oracleのe本 金城俊哉 著」

お盆休みの初日から6日かけて読みました。以前にも読んだことがあり、今回は2~3回目です。

データベースを操作するための SQL という言語の勉強です。

JavaScript とかだったら日常的に使うので身につきますが、SQL は使わないので 2~3回読んでも身につきません。

ちょっとは身についているんだろうか…


「アセンブリ言語ハンドブック 高田美樹 著」

お盆休みの後半 3, 4日かけて読みました。これも以前読んだことがあり、今回で 3回目くらいかな?

私は今44才ですが、私も若いころはこんなふうに「あの本何度読んだ」とか そんなことはしていませんでした

大人になると執念深くなるんでしょうか。

でも、アセンブラも使わないので、身についている感じがしません。


応用情報の資格試験受験の申込みをしてありますが、ちゃんと勉強するのかな…。

お盆休みはちゃんと貫いて勉強できましたが、応用情報の勉強はちょっと失速気味だな。



メモリーのしくみを理解して、プログラミングに強くなろう -[dram]

(この記事は書き途中です。2019/10/6現在毎週加筆していますが、なかなか完成しない…)

メモリーのしくみなどハードウェアを理解すると、プログラミングで応用が利くようになりま。

ブラックボックスだったパソコンの正体が見えてくると、興味がわいてくると思います。

また、見えなかったものが見えると、自由に使いこなせる気がするものです。

ただし、基礎や本質といった部分は勉強に時間がかかり、なかなか勉強する時間は取りづらいので、そのつもりで臨みましょう。


今年のゴールデンウィークのときに、パソコンのメモリーのしくみについて このホームページ上で説明しまし。



パソコンの中にはメモリー基板が入っていて、その基板にはメモリー IC がいくつか載っていて、そのメモリー IC の中はメモリセルと呼ばれる小さな回路がメモリーの容量の分 敷き詰められていて、そのメモリセル 1 つが 1 ビットの情報を保持している。そしてそのメモリセルは基本的にコンデンサであって、コンデンサに電気が溜まっていれば「1」を表し、電気が溜まっていなければ「0」を表す…という説明でした。

この記事です。


その説明の最後のほうで…



このように、4か月前、説明の足らない部分について修正の予告をしていました。


どの点が説明が足らないのかと言うと、プログラムでたとえば整数の 123 を使ったとき、123 はコンピューターの 2進数で表すと、0111 1011 となり、そのビットの並びが、そのままメモリー IC の中で、電気を蓄えたコンデンサと電気を蓄えていないコンデンサの並びに対応していると きっぱり言ってしまっているところです。この説明だけだと、本当にそうなっているのか、いまいち信じられない状態です。

そういうことなので、今回は DRAM メモリー と同じ回路を作って、マイコンからメモリーを書き込んだり読み込んだりして実験してみることにします。

実際に動いているところを見れば、説明も「そうなんだ」と理解できるのではと思います。

それでは始めましょう。結構長い説明です。


一般の人でも理解! DRAM メモリーのしくみ -[dram]

小学校の理科の実験でやったことを確認

DRAMメモリーは、電気の基本的な回路と、ちょっとの新しい知識があれば、理解できると思います。

まずは電気の基本的な回路を確認しましょう。


以降の説明は、あくまでも、DRAM のしくみを理解するための説明です。

説明の中で電気回路のしくみについて詳しく説明していますが、「電気回路の 製作 を教えている読み物」ではありません。

もし、説明に合わせて自分でも回路を組んでみよう(電子工作をしよう)という方は、電気を扱う際は危険なこともあるので注意してください。

できればちゃんとした電子工作入門の本を購入していただいて、注意点を読む等、きちんとした手順を踏んで電子工作を始めてください。

簡単に言えば、電池のプラスとマイナスがに接触(ショート)しないようにし、また、途中の回路でも同じく「ショート」が起こらないようにしてください。

そして、部品にはそれぞれ「定格」というものがあり、電子工作を楽しむためにはとても重要なことなので、よく調べてください。定格とは、たとえば、豆電球に電池をたくさんつないでしまうと焼き切れてしまうといった限度のことです。限度を超えると、部品がするどい音を出して破裂したり、煙が出たりします。非常に危険です。


豆電球と乾電池の回路です。

▼豆電球に 単三型 乾電池 をつなげると、点灯します。

▼その回路図



そこにスイッチを付けるとこうなります。

▼スイッチを付けました。


▼その回路図



ここまでは、簡単なんじゃないかと思います。

一歩進めて…

次は、豆電球を LED に変更してみましょう。

▼豆電球を LED に変更し、電池を直列に増やし 3V にする。


▼その回路図




▼単三型電池1個(1.5V)ではLEDは点灯しません

▼単三型電池2個(3V)ならLEDは点灯します

回路図で LED の記号が出てくると、どこか難しそうに見えますが、豆電球と同じと言えば同じです。

ただ、豆電球は+-どちらをつないでも点灯するけど、LED は LED から出ている線の長いほうを+、短いほうを-につなぎます。


乾電池をボタン電池に変更します。

▼単三型 乾電池をボタン電池に変更します。


▼その回路図




▼LEDはボタン型電池(3V)で手軽に点灯できる


そこへスイッチを付けましょう。

▼スイッチを付けました。

▼その回路図





▼スイッチを押してLED点灯


以上は小学校~中学校あたりの理科の授業でやったものだと思います。

LED も最近は小学校で習うようです。


ちょっとの新しい知識 1 - トランジスタ


トランジスタはスイッチ として使えます。


トランジスタは、黒いボディに3本の線が出ている、という形をしています。

▼トランジスタ

▼実際の写真


3本の線のうち2本は、普通のスイッチと同じようにオン・オフしたい回路をつなげます。

▼普通のスイッチの場合


▼トランジスタの場合



3本の線のうち残りの1本は、普通のスイッチで人間が指でスイッチをオンするのと同じように、この線に電気を流すことでスイッチをオンします。

▼普通のスイッチの場合


▼トランジスタの場合



この線に電気を流すには、電池の + から線を引っ張ってきてつなげます。

しかし、そのままだと電流が大きすぎるので、抵抗を入れて電流を下げます。

▼プラスから線を引っ張ってきてつなげますが…


▼抵抗を入れて電流を下げます



以上を経て、「トランジスタをスイッチとして使う回路」が出来上がりました。

▼トランジスタとスイッチは同じことをします。


▼その回路図




▼「トランジスタをスイッチとして使う回路」

▼抵抗に配線を接続するとLEDが点灯した


トランジスタは電気の勉強としては難しいものですが、上図のように使い方を限ってしまえば、普通のスイッチと同じ感覚で使えます。

でも、結局 手動で接続 しているなら、わざわざトランジスタ  を使わず、普通の手動のスイッチ のままでいいんじゃないか…と思うかもしれません。しかし、この手動でつなげている線をマイコン へつなげれば、プログラムで「3分ごとに1回押す」というようなことができるようになるんです。それがトランジスタ(半導体)の良いところなんですね。




ここまで記事を書いて思ったんですが、話は長くなりそうです…。

一般の人にわからないことは書かない、わかることだけを書く…そんなつもりで書いているので、量も時間も多くなるんですね…。


ちょっとの新しい知識 2 - コンデンサ

ところで、コンデンサって、なじみがありませんよね。

豆電球や単三型 乾電池は使い方はよくわかるけど、コンデンサって使い方が不明です。

▼コンデンサに充電


▼コンデンサから放電


※点灯時間 0.6 秒 くらい

▼コンデンサに充電

▼コンデンサから放電(動画)

コンデンサに 0.6 秒分の電気をためて豆電球を一瞬チカッと光らせたとしても、それは日常では何の役にも立ちそうにありません。

だからコンデンサって一般的な部品にはならない(なじみがない)んでしょうね…。


さきほどの「トランジスタをスイッチとして使う回路」の LED をコンデンサに取り換えてみましょう。

▼LED とコンデンサをとりかえ。


▼その回路図



部品が LED からコンデンサに変わって、回路の機能が「LED点灯」から「コンデンサ充電」へ変わりました。


コンデンサの形がちがっても、同じことができます。

▼コンデンサに充電


▼コンデンサから放電


※点灯時間 0.03 秒 くらい

▼コンデンサに充電

※0.1uは容量が小さすぎるせいか抜き差しすると充電がなくなるらしく、写真のようにコンデンサを抜き差ししないで充放電 両方試せる回路が必要でした。

▼コンデンサから放電

▼コンデンサへ充電 (トランジスタ使用)


▼その回路図



この青いタイプのコンデンサ を使って DRAM 回路を作っていきます。



ちょっとの新しい知識 3 - マイコン

マイコンについて簡単に見ていきましょう。(この項目は 2020/1/31 現在作成中です)

豆電球も LED も電池を接続することで点灯します。

マイコンも同様に、こんなふうに電池を接続することで動作します。

マイコンにプログラムを書き込むにはパソコンが必要です。

しかしマイコンとパソコンを接続するにはどうしたらいいのでしょうか…

どんな種類のマイコンにしろ、たいていはこういうものが必要です。

「マイコン内蔵のプログラムメモリに、書き込みを行うためのライタ」です。

図は PIC というマイコンのライタで、だいたい 5,000円 程度です。

ライタをどのように接続するのかというと…

こんなふうに接続します。なかなか大変そうですね。


また、たいていのマイコンは、「書き込むプログラムを、プログラミングするための専用のソフトウェア」(開発環境)が必要で、そのマイコンのメーカーから無料で提供されています。

例で示した PIC というマイコンに対応する開発環境は、MPLAB-IDE です。「エムピーラブ、アイ・ディー・イー」と読みます。



このボタン電池をマイコン に変更すると、いよいよ DRAM メモリーっぽくなってきます。

▼ボタン電池とマイコンをとりかえ



▼せっかくピンがたくさんあるので赤と緑の配線を分離しましう。


ところで、マイコンにはピンがたくさんありますが、それぞれ「出力」と「入力」のどちらかを選ぶことができ、さらに出力は「3V」か「0V」かどちらかを選ぶことができます。



▼マイコンの中で 3V と 0V を切り替えれば、人間の手による手動ではなく、プログラムによる自動でトランジスタをオン・オフできます。


DRAMメモリーですから、コンデンサに対してやりたいことは以下のとおりです。

コンピューターのメモリーは、1010 といった情報、つまり 1 や 0 を書き込むし、またそれを読み出しもしますね。


コンデンサに電気をためる。(情報1を書き込む)

▼コンデンサに電気をためる


コンデンサに電気をためる手順:

  1. 図中のピン を「出力3V」に設定する。
  2. 次に、ピン を「出力3V」に設定することでトランジスタをオンする。
  3. すると、コンデンサに3Vが出力され、コンデンサに電気をためることができます。
  4. トランジスタをオフにする。

これがつまり、「メモリーに情報1を書き込んだ」ということです。

このあと、コンデンサは電気を保持(メモリー)し続けます。


コンデンサにたまった電気を消去する。(情報0を書き込む)

▼コンデンサにたまった電気を消去する



コンデンサにたまった電気を消去する手順:

  1. 図中のピン を「出力0V」に設定する。
  2. 次に、ピン を「出力3V」に設定することでトランジスタをオンする。
  3. すると、コンデンサに0Vが出力され、コンデンサにたまった電気を消去できます。注)
  4. トランジスタをオフにする。

これがつまり、「メモリーに情報0を書き込んだ」ということです。


コンデンサに電気がたまっているかどうかを調べる。(情報を読む)

▼コンデンサに電気がたまっているかどうかを調べる




コンデンサに電気がたまっているかどうかを調べる手順:

  1. 図中のピン を「入力」に設定する。
  2. 次に、ピン を「出力3V」に設定することでトランジスタをオンする。

  3. コンデンサに電気がある場合:
    コンデンサからピン へ向かって放電されます。マイコンはその放電を受け取り、入力ピンに3V(くらい)が入力されたと認知します。
  4. コンデンサに電気がない場合:
    コンデンサからピン へ向かって放電されず、マイコンは0Vを受け取り、入力ピンに0Vが入力されたと認知します。
  5. トランジスタをオフにする。

これがつまり、「メモリーから情報を読んだ」ということです。繰り返し読んでもコンデンサの電気はすぐになくなりません。しかしこの 0.1u という容量のコンデンサは実際に測ったら3,4分くらい経過すると電気が消滅するようです。


以上は1つのコンデンサについてメモリとして読み書きしているので、「1ビットメモリー」と言えるでしょう。


ここまで読んだら、Wikipediaの記事がわかる

この「1ビットメモリー」は、Wikipedia の DRAM のページで説明されている「メモリセル」にあたるものです。

Wikipedia - DRAM(Dynamic Random Access Memory)- 3.2 メモリセル構造

ここまで読んで、DRAM のしくみをある程度理解していただいた方には、この Wikipedia のページは以下の言葉の読み替えだけ行えば、だいたい理解して読めると思います。



実際に回路を組みたい方へ

ここで電子回路を自分で組める人のなかには「1ビットメモリー回路」を試してみようと思う人もいるかもしれません。

しかし、一筋縄ではいかないところがあります。

ちょっと大げさに書くと、コンデンサの容量、マイコンの動作速度、プログラムによる制御のタイミングなどがからんで、上記で説明した単純な手順で実践しても、動かない確率が高いです。

「なんだ動かないじゃん」とがっかりさせちゃうのも申し訳ないので、ちょっと策を考えておきます…。

策ができあがるまで、実際に動いている回路の資料を掲載しておきますので、必要な方はご覧ください。


ご注意:↑この素材は、
「Illust AC」 の素材です。
IchigoCake の場合:

  1. 正常動作している回路の写真   動作結果を示す写真
  2. その回路の模式図 (実体配線図)
  3. その回路を制御する IchigoCake BASIC プログラム(1ビットに「0」を書き込めるかテストするもの)

    プログラムを RUN して、「0」が表示されること。
    その後、120行目の「OUT 1,0」を「OUT 1,1」に変更し、
    再び RUN して、「1」が表示されれば、正常動作です。


PIC24H の場合:

  1. PIC24H の LED 点灯回路

    写真   模式図   プログラム
    PIC24H は LED をボタンで点灯するためにこれだけの回路を組みます。

    電源について:
    模式図のとおりにした場合、電源は PICkit3 から供給するように MPLAB-IDE のプロジェクトに設定をします。
    MPLAB-IDE にて、File メニュー>Project Properties (そのプロジェクト名)>(表示される画面の)左のリストで PICkit 3 クリック>右の上部の)Option categories: プルダウンメニューで「Power」を選択>Power target circuit from PICkit3 にチェックを入れる。OK ボタンで画面を閉じる。
    (2020/2/22 長い間、この電源についての記載がありませんでした、悩んでしまった方、本当にすみませんでした。)


    動かない例1:The target circuit may require more power than the debug tool
    動かない例2:配線の接触が悪い

    他にもいろいろと動かない例がありますが、ここですべてをカバーすることはできないので、自分で調べてもらうか、このページの一番上の「aboutThisWebsite」の「感想、意見、その他お問い合わせ」から症状を伝えてください。

    LED 点灯の動作を確認したら、
    LED の回路を元にして下記の資料をもとに DRAM 回路を作っていきます。
  2. 正常動作している回路の写真
  3. その回路の模式図 (実体配線図)

    2重線で区別した配線が LED 点灯回路からの新しい配線です。
  4. その回路のマイコンに書き込む C 言語プログラム(上記 IchigoCake のプログラムと同じ動きで作成)

    プログラムを書き込んだときや、リセットボタンを押したときに LED が 2 回点滅 すること。「0」を意味します。
    その後、コメントで「★★★」で目印を付けてある行の「LATBbits.LATB8 = 0;」を「LATBbits.LATB8 = 1;」に変更し、
    再び実行して、LED が 1 回点滅 すること。「1」を意味します。それで正常動作です。
    動作の詳しい説明:
    コメント「★★★」の行が「LATBbits.LATB8 = 0;」のときは、RB8 というピンを0Vにしています。それはコンデンサに向かって0V を出力することになります。トランジスタをオンにすると回路が接続されるので実際に出力されます。その後、プログラム中の「r = PORTBbits.RB8;」の行で RB8 ピンを読み込みするとマイコンはコンデンサから0Vを受け取るので、プログラムの表示のところで 2 回点滅(「0」の意)します。
    コメント「★★★」の行が「LATBbits.LATB8 = 1;」のときは、RB8 というピンを3Vにしています。それはコンデンサに向かって3V を出力することになります。トランジスタをオンにすると回路が接続されるので実際に出力されます。その後、プログラム中の「r = PORTBbits.RB8;」の行で RB8 ピンを読み込みするとマイコンはコンデンサから3Vを受け取るので、プログラムの表示のところで 1 回点滅(「1」の意)します。


1ビットメモリーを横に並べる。

中学校の理科でやったことで、もう1つ確認しておいたほうが良いことがあります。

▼豆電球を3つ、乾電池につなげる



どれも同じ明るさで光る。
▼その回路図


並列回路では、各豆電球の電圧は電源の電圧と同じ。

▼並列につないだ3つの抵抗の各電圧を測る

▼電池は3Vで、各抵抗も3Vとなった

同じ電気信号を、複数の場所で使いまわしたいとき、この並列の枝分かれを使います。


ここから説明も大変になってきますが、覚悟を決めて取り組むことにします。


では、1 ビットメモリーを横に並べて 2 ビットメモリーへと変更していきましょう。


▼トランジスタとコンデンサ、10kの抵抗をもう1セット用意します。

▼抵抗につながる「スイッチ」の配線を、並列になるように一本増やして…

▼新しい抵抗につなげます。両方のトランジスタに同じ電流が流れます。


▼2つになったコンデンサは、それぞれ別々のビットなので…


▼マイコンに新しいピン C を用意して図のように新しいトランジスタとつなげます(”ピンを用意する” とはマイコンに書き込むプログラムでそのピンを使うようにプログラムする、ということです)。ピンを別々にしたので、それぞれのコンデンサで別々の情報を読み書きできます。もし両方とも1つのピンにつなげてしまうと、両方とも一緒に1になったり0になったりしてしまいます。1つのピンで2つの情報を一度に流すことはできません。


▼最後に「ー」をつなげます。

以上で 2 ビットメモリーになりました。


では、メモリーとしての書き込み、読み込みを見てみましょう。

▼書き込み:

たとえば、2進数の数値「10」を書き込みたいときは、
ピン B は1桁目で、書き込みたい2進数の1桁目は「0」なので、「0V」に設定し、
ピン C は2桁目で、書き込みたい2進数の2桁目は「1」なので、「3V」に設定します。
そして2つのトランジスタにつながるピン A を 3V に設定すれば、書き込みされます。

▼読み込み:

そして入力するには、
ピン B、ピン C ともに入力に設定し、
2つのトランジスタにつながるピン A を 3V に設定すれば、読み込みされ、読み込み結果は2ビット合わせて「10」になります。


実際に回路を組みたい方へ2

ここで電子回路を自分で組める人のなかには「1ビットメモリー回路」につづいて、「2ビットメモリー回路」も試してみようと思う人もいるかもしれません。

しかし、「1ビットメモリー回路」同様、「2ビットメモリー回路」も一筋縄ではいかないところがあります。

実際に動いている回路の資料を掲載しておきますので、必要な方はご覧ください。

ご注意:↑この素材は、
「Illust AC」 の素材です。

IchigoCake の場合:

  1. 正常動作している回路の写真   動作結果を示す写真
  2. その回路の模式図 (実体配線図)
  3. その回路を制御する IchigoCake BASIC プログラム(2ビットに「10」を書き込めるかテストするもの)

    プログラムを RUN して、「0」につづいて「1」が表示されること。これは2進数で「10」、10進数では「2」を意味します。
    その後、120 行目の「OUT 1,0」と、125 行目の「OUT 2,1」のそれぞれ 2 つ目の数字を変更し、
    再び RUN して、意図した数字が表示されれば、正常動作です。
    たとえば、
    120行目の「OUT 1,0」 → 変更 → 「OUT 1,1」
    125行目の「OUT 2,1」 → 変更 → 「OUT 2,0」 (…2つのビットを合わせて2進数で「01」、10 進数では「1」を意味します)
    結果は、「1」につづいて「0」と表示されるはずです。
    10進数の「3」も試してみましょう。


PIC24H の場合:

  1. 前述の PIC24H の「1ビットメモリー回路」をまず先に作成して、
    そこから変更を加えます。
  2. 正常動作している回路の写真
  3. その回路の模式図 (実体配線図)

    2 重線で区別した配線が「1ビットメモリー回路」から追加した新しい配線です。
  4. その回路のマイコンに書き込む C 言語プログラム(上記 IchigoCake のプログラムと同じ動きで作成)

    プログラムを実行すると、
     1. 表示開始を知らせる合図 LED が素早くチカチカッ
     2. 2 つのビットが表す 2 進数を 10 進数に直した数値の数だけ LED が点滅。 ここでは 10 進数「2」なので 2 回点滅するはずです。
     3. 表示終了を知らせる合図 LED が素早くチカチカッ
    というように LED が点滅するはずです。

    つづいて、プログラムの中のコメントで「★★★」で目印を付けてある行は2行ありますが、それぞれ代入する0,1を変更した上で、
    再び実行して、意図した数字が LED で示されれば、正常動作です。
    たとえば現状、
    LATBbits.LATB8 = 0; (右のビット)
    LATBbits.LATB9 = 1; (左のビット…左右合わせて2進数で「10」、10 進数で「2」を意味する)
    となっているところ、
    LATBbits.LATB8 = 1; (右のビット)
    LATBbits.LATB9 = 0; (左のビット…左右合わせて2進数で「01」、10 進数の「1」を意味する)
    このように変更します。
    この結果は10 進数「1」なので 1 回点滅するはずです。
    10進数の「3」も試してみると面白いかもしれませんね。

IchigoCake から BASIC の「IN( 1 )」という命令や、「OUT 6,1」という命令でちゃんと読み書きできる様子が、どこか素直に感じられました。


(素直と言ったら自分だと言おうとしている)


さらに横に並べて8ビットメモリーにする。

では、同じ調子で、合計 8 ビットになるようにビットを追加していきましょう!

▼「2ビットメモリー」から「8ビットメモリー」へ


そして、とうとう「8ビットメモリー」になりました。

▼「8ビットメモリー」

数が増えただけで、基本的に動きは変わりません。

図の右下のマイコンの、右端の緑の線がつながったピンを出力3Vに設定すると、8個のトランジスタが一斉にスイッチオンになるところを想像してください。

そして一斉にコンデンサの中身が、「入力」に設定されたマイコンの各ピンへと流れていくことも想像してください。(読み出しの動き)

書き込みの場合は、出力0Vなり、3Vなりに設定された各ピンからコンデンサへ向かって電流が流れていくわけですね。


実際に動いているところを写真に撮ったのでご覧ください。


その1

▼上図のマイコン部分を IchigoCake にした場合

「123」という数値を2進数「0111 1011」に直してメモリーに書き込み、つづいて読み出しを行い、読み出した結果を画面に表示しています。


実際に電子回路を組む方のための資料:

その2

▼上図のマイコン部分を PIC24H にした場合

「123」という数値を2進数「0111 1011」に直してメモリーに書き込み、つづいて読み出しを行い、読み出した結果を10進数に直し、LED の点滅の回数で知らせています。


実際に電子回路を組む方のための資料:



1ビットメモリーを縦に並べる。

パソコンのメモリーには「アドレス」というものがあり、アドレス 1 つ 1 つは 8 ビットのデータを持っています。


これまで作成した「8ビットメモリー回路」は、いわばアドレスが1つしかないメモリーです。

そこへ縦にもう 8 ビット並べて、できた 2 行をそれぞれ、アドレス1とアドレス2として、2つのアドレスを選んで 8 ビットを読めるような回路にしていきます。それができれば DRAM 回路は完成です。

しかし、いきなり 8 ビットを 2 行にしても、難しいので、1 ビットを縦に並べることから始めましょう。


1ビットメモリー回路です。これを縦に並べていきましょう。


トランジスタとコンデンサ、10kの抵抗をもう1セット用意します。


マイコンに新しいピンJを用意して、新しい抵抗とつなげます。

この緑の配線が2つになったことが、アドレスが2つになったことに相当します。


2つのコンデンサは、同じ「1ビット目」です。

(あとで横に8ビット並べたとき、この2つは両方とも8ビットのうちの1ビット目に当たる、ということです


それぞれ1ビット目である2つのコンデンサがトランジスタを介して2つともピンBにつながるようにします。


最後に「-」をつなげます。

以上で2アドレスになりました。


複雑に見えますが、把握しましょう。わっか(回路)はまず上に1つと…


下にもわっか(回路)が1つあります。


では、メモリーとしての書き込み、読み込みを見てみましょう。

▼「アドレス1」に2進数「1」を書き込み


  1. 2進数「1」を書き込みたいので、「1ビット目」につながるピンB (赤い配線)を「出力3V」に設定する。

    設定する

  2. つづいて、「アドレス1」につながるピンA (緑の配線)を「出力3V」に設定する。

    設定する

    すると、アドレス1の回路のスイッチが入る。
    回路がつながると、ピンB から3Vが出力されるので、コンデンサに充電される。
  3. 最後に、ピンA (緑の配線)を「出力0V」に戻す。

    設定する

    すると、アドレス1の回路のスイッチが切れる。
    書き込み終了。
    以後、コンデンサは「充電あり」を保持する。

上の図では二つの回路のうち下のほうの回路をグレーアウトさせています。

ここでは上の回路の「アドレス1」にだけアクセスできれば良いので、下の回路の「アドレス2」はスイッチオフの状態にしておきます。

これは、下図のように豆電球を並列に2個つないで、1つの豆電球をソケットから外した状態と同じと考えられます。

ソケットから外した豆電球には電気はまったく通らないので、存在しないことと同じです。

次の図では、今度は上の回路がグレーアウトしています。


▼「アドレス2」に2進数「0」を書き込み


  1. 2進数「0」を書き込みたいので、「1ビット目」につながるピンB (赤い配線)を「出力0V」に設定する。

    設定する

  2. つづいて、「アドレス2」につながるピンJ (緑の配線)を「出力3V」に設定する。

    設定する

    すると、アドレス2の回路のスイッチが入る。
    回路がつながると、ピンB から0Vが出力されるので、コンデンサは充電が消去される。
  3. 最後に、ピンJ (緑の配線)を「出力0V」に戻す。

    設定する

    すると、アドレス2の回路のスイッチが切れる。
    書き込み終了。
    以後、コンデンサは「充電なし」を保持する。


▼アドレス1を読み込み


  1. 「1ビット目」を読み込みたいので、「1ビット目」につながるピンB (赤い配線)を「入力」に設定する。

    設定する

  2. つづいて、「アドレス1」につながるピンA (緑の配線)を「出力3V」に設定する。

    設定する

    すると、アドレス1の回路のスイッチが入る。
  3. そして、ピンB の入力を実行する。

    設定する

    すると、コンデンサが保持していた電気3Vまたは0VがピンBへ流れる。
    マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。

  4. 最後に、ピンA (緑の配線)を「出力0V」に戻す。

    設定する

    すると、アドレス1の回路のスイッチが切れる。
    読み込み終了。


▼アドレス2を読み込み


  1. 「1ビット目」を読み込みたいので、「1ビット目」につながるピンB (赤い配線)を「入力」に設定する。

    設定する

  2. つづいて、「アドレス2」につながるピンJ (緑の配線)を「出力3V」に設定する。

    設定する

    すると、アドレス2の回路のスイッチが入る。
  3. そして、ピンB の入力を実行する。

    設定する

    すると、コンデンサが保持していた電気3Vまたは0VがピンBへ流れる。
    マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。

  4. 最後に、ピンJ (緑の配線)を「出力0V」に戻す。

    設定する

    すると、アドレス2の回路のスイッチが切れる。
    読み込み終了。

このように2つの回路のうち、どちらか一方のトランジスタをオンにすることで、その回路だけを有効にしてメモリーの読み書きを行っているわけです。

それがつまり、メモリーの「アドレスを指定する」という動きです。

C言語などの「ポインタ」に1を足してアドレスを進めていた時、パソコンの中ではこういう動きになっていたんですねぇ。

電子回路のこういうしくみ、面白いですよね



「2アドレス1ビットメモリー」。実際に動いているところを見てみましょう。

その1

▼上図のマイコン部分を IchigoCake にした場合

2進数の「1」をアドレス1に書き込み、

2進数の「0」をアドレス2に書き込んでいます。

その後、アドレス1とアドレス2を読み込んで結果を画面に表示しています。1と0が表示されます。


実際に電子回路を組む方のための資料:

  • 0.1uF(印字104) … 両アドレスとも1になってしまう。
  • 1uF(印字105) … 正常動作(こちらを使用した)
  • 10uF(印字106) … 正常動作

その2

▼上図のマイコン部分を PIC24H にした場合

2進数の「1」をアドレス1に書き込み、

2進数の「0」をアドレス2に書き込んでいます。

その後、アドレス1とアドレス2を読み込んで結果を LED の点滅の回数で知らせています。

LED は「チカーッ チカッ チカーッ … チカーッ」と点滅します。

「チカーッ」は区切りを意味します。区切りのあいだで「チカッ」と点滅すれば1を表し、沈黙すれば0を表します。

▼正しく点滅している様子

(MP4動画 640x480 1.32MB 11sec.)


実際に電子回路を組む方のための資料:

  • 0.1uF(印字104) … 両アドレスとも1になってしまう。
  • 1uF(印字105) … 正常動作(こちらを使用した)
  • 10uF(印字106) … 正常動作

(PIC24H は他の回路では 0.1uF でも OK なのに、ここでは正常動作になりません。原因は不明です)

以上、「2アドレス1ビットメモリー」でした。


…なんか、プログラミングに強くなるためと言いつつ、バリバリに電子回路の話になっていますが…。

電子回路というよりは、ものごとのカラクリを知ってほしいだけです。

メモリーのしくみを一から知ることが、プログラミングの力になるんです。



「2アドレス1ビットメモリー」を横に並べる。

「2アドレス1ビットメモリー」をさらに横に並べて、「2アドレス2ビットメモリー」にしましょう。


2アドレス1ビットメモリー回路です。これを横にもう1ビット増やす手順を見ていきましょう。

横に 1 ビット増やすことができれば、目的の 8 ビットにすることもできる、ということです。


トランジスタとコンデンサ、10k の抵抗を隣にもう1セット用意します。


抵抗につながる「スイッチ」の配線を、並列になるように一本増やして…


新しい抵抗につなげます。

ちなみに、並列になるので、枝分かれした配線には同じ電圧がかかるようになります。


下の回路も同様に線を増やします。


新しい2つのコンデンサは、上のほうが「アドレス1の2ビット目」、下のほうが「アドレス2の2ビット目」で、両方とも「2ビット目」のコンデンサです。


マイコンに新しいピンCを用意して新しいトランジスタへつなげます。

ピンBは1ビット目の読み書きに使い、ピンCは2ビット目の読み書きに使います。

そういう役割になっています。


下の回路のほうも同じ「2ビット目」ということで、ピンCとトランジスタをつなげます。

もしも、アドレスを3アドレス、4アドレス…と、どんどん増やすなら、それらの1ビット目はすべてピンBへ、2ビット目はすべてピンCへとつなげることになります。


 最後に「-」をつなげます。


下の回路の「-」もつなげます。

以上で2アドレス2ビットになりました! しかし配線がだいぶ多くなってゴチャゴチャとしています。

整頓しましょう。


下図の左のように同じ端子につながる配線というのは、右のように配線の途中につなげたとしても、変わりのない同じ回路です。


…なので、このように整頓できます。線が少なくなって見通しが良くなりました。

この図はクリックすると、「2アドレス2ビット」と「2アドレス1ビット」を切り替えます。

何度もクリックして、どのように追加されたのか見極めてください。

この調子でこのあと、3ビット目、4ビット目と追加して8ビット目まで作るんですが、どうやって追加していけばいいかはもうわかりますよね。

※このホームページは、誰かに見てもらって「ここがわからない」とか「もっとこうしたほうがいい」などの意見を聞いて修正する、という工程を踏んでいないので、もしかしたら「わからない…」ということになってしまっているかもしれません。しかし、2,3ヶ月後に私自身があらためて読んで修正するということは頻繁に行っています。


では、「2アドレス2ビットDRAMメモリー回路」の、メモリーとしての書き込み、読み込みを見てみましょう。

▼「アドレス1」に2進数「10」を書き込み


  1. 書き込みたい2進数「10」の1ビット目は「0」なので、「1ビット目」につながるピンB (赤い配線)を「出力0V」に設定する。

    設定する

  2. 書き込みたい2進数「10」の2ビット目は「1」なので、「2ビット目」につながるピンC (ピンクの配線)を「出力3V」に設定する。

    設定する

  3. 1 つづいて、アドレス1の各ビットの回路をオンにしたいので、「アドレス1」につながるピンA (緑の配線)を「出力3V」に設定する。

    設定する

    2 すると、アドレス1の回路のスイッチが入る。
    3 回路がつながると、ピンB からは0Vが出力されるので、コンデンサは充電が消去される。ピンC からは3Vが出力されるので、コンデンサは充電される。
  4. 1 最後に、ピンA を「出力0V」に戻す。

    設定する

    2 すると、アドレス1の各ビットの回路のスイッチが切れる。

    書き込み終了。
    以後、各コンデンサは「充電なし」や「充電あり」を保持する。



▼「アドレス2」に2進数「01」を書き込み


  1. 書き込みたい2進数「01」の1ビット目は「1」なので、「1ビット目」につながるピンB (赤い配線)を「出力3V」に設定する。

    設定する

  2. 書き込みたい2進数「01」の2ビット目は「0」なので、「2ビット目」につながるピンC (ピンクの配線)を「出力0V」に設定する。

    設定する

  3. 1 つづいて、アドレス2の各ビットの回路をオンにしたいので、「アドレス2」につながるピンJ (緑の配線)を「出力3V」に設定する。

    設定する

    2 すると、アドレス2の回路のスイッチが入る。
    3 回路がつながると、ピンB からは3Vが出力されるので、コンデンサは充電される。ピンC からは0Vが出力されるので、コンデンサは充電が消去される。
  4. 1 最後に、ピンJ を「出力0V」に戻す。

    設定する

    2 すると、アドレス2の各ビットの回路のスイッチが切れる。

    書き込み終了。
    以後、各コンデンサは「充電なし」や「充電あり」を保持する。



▼アドレス1を読み込み


  1. 「1ビット目」につながるピンB (赤い配線)と、「2ビット目」につながるピンC (ピンクの配線)を「入力」に設定する。

    設定する

  2. 1 つづいて、「アドレス1」につながるピンA (緑の配線)を「出力3V」に設定する。
    2 すると、アドレス1の回路のスイッチが入る。

    設定する

  3. 1 そしてピンB の入力を実行する。

    実行する

    2 すると、コンデンサが保持していた電気3Vまたは0VがピンB へ流れる。
    3 マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。
  4. 1 次にピンC の入力を実行する。

    実行する

    2 すると、コンデンサが保持していた電気3Vまたは0VがピンC へ流れる。
    3 マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。
  5. 1 最後に、ピンA を「出力0V」に戻す。

    設定する

    2 すると、アドレス1の各ビットの回路のスイッチが切れる。

    読み込み終了。


▼アドレス2を読み込み


  1. 「1ビット目」につながるピンB (赤い配線)と、「2ビット目」につながるピンC (ピンクの配線)を「入力」に設定する。

    設定する

  2. 1 つづいて、「アドレス2」につながるピンJ (緑の配線)を「出力3V」に設定する。
    2 すると、アドレス2の回路のスイッチが入る。

    設定する

  3. 1 そしてピンB の入力を実行する。

    実行する

    2 すると、コンデンサが保持していた電気3Vまたは0VがピンB へ流れる。
    3 マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。
  4. 1 次にピンC の入力を実行する。

    実行する

    2 すると、コンデンサが保持していた電気3Vまたは0VがピンC へ流れる。
    3 マイコンは3Vを受け取った場合は「1」、0Vを受け取った場合は「0」と判断する。
  5. 1 最後に、ピンJ を「出力0V」に戻す。

    設定する

    2 すると、アドレス2の各ビットの回路のスイッチが切れる。

    読み込み終了。


「2アドレス2ビットDRAMメモリー回路」のメモリーの読み書きの動きを見てきました。

では次に実際に動いているところ(実験)を見てみましょう。

はっくしょん!!
ふきだしけす


その1

▼「2アドレス2ビットDRAMメモリー回路」と IchigoCake を接続した場合

プログラムで、2進数の「10」をアドレス1に書き込みし、

2進数の「01」をアドレス2に書き込んでいます。

その後、アドレス1とアドレス2を読み込んで結果を画面に表示しています。0、1、1、0と表示されています。

最初の0、1がアドレス1の1ビット目、2ビット目の読み込み結果で合わせて「10」。

次の1、0がアドレス2の1ビット目、2ビット目の読み込み結果で合わせて「01」です。


実際に電子回路を組む方のための資料:

その2

▼「2アドレス2ビットDRAMメモリー回路」と PIC24H を接続した場合

プログラムで、2進数の「10」をアドレス1に書き込みし、

2進数の「01」をアドレス2に書き込んでいます。

その後、アドレス1とアドレス2を読み込んで結果を LED の点滅の回数で知らせています。

チカーッ → チカッチカッ → チカーッ → チカッ → チカーッ
区切りの意 "アドレス1は
「2」です"
区切りの意 "アドレス2は
「1」です"
区切りの意

    

▼正しく点滅している様子

(MP4動画 640x360 1.44MB 12sec.)


実際に電子回路を組む方のための資料:

以上、「2アドレス2ビットメモリー」でした。


次は「2アドレス8ビットメモリー」です。

パソコンに搭載されている「メモリー」とほぼ同じものになったと言って良いでしょう。


上記の「2アドレス2ビットメモリー」から左方向へ6ビット増やし、増やしたビットの分、プログラムも処理を増やしています。

なお、これ以降の回路の動きについては、すでに「1アドレス2ビットメモリー」や、「2アドレス1ビットメモリー」で、横1列や縦1列の動きを説明したし、さらに「2アドレス2ビットメモリー」で横2列、縦2列の2次元的な動きも説明してもう十分だと思うので、動きの説明はこれ以上はしないことにします。


▼「2アドレス8ビットメモリー」の写真 (マイコンは PIC24H を使用)

▼DRAM回路部 拡大
▼マイコン部 拡大
▼LED点滅ではなく、液晶表示にしたバージョン

アドレス1に2進数 0000 1111(10進数で15)、
アドレス2に2進数 1111 0000(10進数で240)を書き込み、
それぞれ読み込んで、結果の10進数を液晶に表示したところ。

(※IchigoCake版はまた次回にします)


▼その模式図(実体配線図) ※以降で不具合の話をしていて、新しいバージョンを掲載しています。

この右上のうすい緑色のエリアは、1つ前の「2アドレス2ビットDRAMメモリー回路」にあたる部分です。

マイコンのC言語プログラムリスト(まだ清書していませんが…)(以降で不具合の話をしていて新しいバージョンがあります)


感想:

これまで試行錯誤を重ねてきたおかげでわりとあっさりと動作してくれました。

最初のころはごく小さな容量のコンデンサを使っていたので、動いたり動かなくなったりと大変でした。

ところで、最近は月刊誌(トランジスタ技術2020年5月号)でも CPU の自作が特集されていたりして、もはやメーカーではない一般人が CPU も DRAM も自作できる時代になったようですね。



不具合発生:

電子回路がわかる人向けの話になりますが、あとになって上の回路で問題があることに気づきました。

「マイコンにプログラムを書き込んだ直後」はこのメモリーは正常に動作するけど、「リセットボタンを押してマイコンを再起動した場合」はアドレス2の読み出しの値がプログラムどおりに動けば「240」となるはずが「0」と表示される…


プログラムを変更して、処理するビット数を8ビットから4ビットに減らすと正常に動作します。

調べてみると、全ビット数が8~5ビットだと動作がおかしい、4~1ビットだと正常動作する、という結果になりました。

全8ビット
おかしい
全7ビットに減らした おかしい
全6ビットに減らした おかしい
全5ビットに減らした おかしい
全4ビットに減らした 正常動作
全3ビットに減らした 正常動作
全2ビットに減らした 正常動作
全1ビットに減らした 正常動作

マイコンが出力できる電流は無尽蔵ではなく、たとえば家庭の電気をたくさん使うとブレーカーが落ちるように、マイコンもピンにたくさん何かをつなぐと電流が足らなくなり回路がうまく動作しなくなる…ということが起こります。(ICのそういう制限のことを「ファンアウト」といいます)

PIC24Hのデータシート(DS70289J-page 199)の

「22.0 ELECTRICAL CHARACTERISTICS」という小題の、「Absolute Maximum Ratings(1)」の項目を見ると、

Maximum current sourced/sunk by any 2x I/O pin(3) ................................................................................................8 mA
Maximum current sourced/sunk by any 4x I/O pin(3) ..............................................................................................15 mA
Maximum current sourced/sunk by any 8x I/O pin(3) ..............................................................................................25 mA
Maximum current sunk by all ports .......................................................................................................................200 mA
Maximum current sourced by all ports(2)...............................................................................................................200 mA

このへんの電流の制限を、このDRAM回路は超えているってことかなぁ…?

これについて私が思い付く対策は以下のような感じです。

    1. ピンの系統にRAとRBがありますが、現在RBという系統のピンだけを使って8ビットすべてをつなげているので、試しに4ビット分をRAという系統のピンへ振り分けてみる。(「ピンの系統」という言い方は通常はしませんがわかりやすくするために)
    2. 各ビットで使用しているコンデンサの容量を10uFから1uFに変えてみる。理論的な根拠は知識がないので示せませんが、それでいけるかもなぁと。
    3. 回路の電源をPICkit3から供給しているのをやめて、外部のACアダプタから電源を取るようにしてみる。

以上、3つとも試しましたが、うまくいったのは1番でした。2,3番は症状が同じで変わりませんでした。

そういうわけで解決に至ったのですが、「問題は本当にファンアウトなのか」というのと、仮にファンアウトだとして「なんでRBだけだったのを一部RAに振り分けることで解決となるのか」という疑問点がそのまま残っていて、力不足を感じました。

あと、「書き込み後」と「リセット後」とで動作結果が異なるって、どういうことなんでしょうね。

パソコンで言うと、電源入れたときと再起動とで Windows の調子が異なる、ということです。どっちも同じなんですがねぇ。。



パソコンから書き込みしたときは良いけど、基板のリセットボタンを押したときは、基板がこう言っているんですよ。

「あっ、さわってんじゃねぇよお」


いろいろ調べていてわかってきたことなんですが、

読み書きそれぞれポイントが見えてきました。

しかしそれら2点には

が関わっているので、この2点の時間決めは手探りになってしまいます。

コンデンサの電気的な特性とか、マイコンの細かいしくみとか、知っていれば、そういう手探りもしなくていいのかもしれません。


▼不具合対応した後の模式図(実体配線図)

不具合対処したプログラムリスト(清書していません)

模式図とプログラムリストは、 です。


以上不具合の対処のお話でした。



このあとは、

…などの記事を書いて、いくつか不備のある記事を手直しし、全体を章立てして読みやすくまとめて、それで完結にする予定です。

終わるのいつだろう…

※また後日更新予定です。



▼こちらは動画です(マイコンPIC24Hを使用)

写真のメモリは、全2番地、各番地8ビットという、とても低容量なメモリです。全2バイトあるので「2バイトメモリー」と命名しましょう。


たとえば、1GBのメモリをこの調子で作るとしたら…

1GB = 1,000MB = 1,000,000(百万)KB = 1,000,000,000(10億)byte = 8,000,000,000(80億)bit だから、

80億個のトランジスタとコンデンサを写真のように組まなきゃなりません。


80億?! うぇ~っ!

80億!! ゥハァー!

うぇ~ハァー( ウェハー )を使えば80億くらい一瞬ね…


おまけコーナー:

FILE DOWNLOAD
 
こういう顔イラストが数点入っています。
Excel 版は Office の図形なので、編集できます。
PDF 版は編集はできませんが、閲覧したり拡大したりできます。
私はイラストは素人でなおかつ手抜きをしていますが、多少、価値があると思うので著作権フリーで公開します。
2020/2/16

Excel 版
1.5 MB
DOWNLOAD

PDF 版
636 kB
DOWNLOAD
HISTORY
更新 2020/2/16
8点追加 合計25点

************************
更新 2019/11/2
4点追加 合計17点

************************
公開 2019/10/14
13点


(訪問者のどんなニーズと この記事がつながるか)




webappsrcの確認

1. %%com.webapp.src:/webappsrccheck.html%%
と記述した場合

webapps/src/default.cssのスタイル指定が効く
<!DOCTYPE html><!--ESCAPEPROCESS-->

<head>

<script>

function onloadx() {

//一般関数

console.log( "文字列" );

}

function Class1() {

//クラス

console.log( "文字列" );

}

Class1.prototype.method1 = function() {

//メソッド

console.log( "文字列" );

}

</script>

</head>

<body onload="onloadx();" style="">

Hello world!<BR>

</body>

</html>



2. <code>
%%com.webapp.src:/webappsrccheck.html%%
</code>
と記述した場合

このファイルのcodeのスタイル指定が効く
<!DOCTYPE html><!--ESCAPEPROCESS-->

<head>

<script>

function onloadx() {

//一般関数

console.log( "文字列" );

}

function Class1() {

//クラス

console.log( "文字列" );

}

Class1.prototype.method1 = function() {

//メソッド

console.log( "文字列" );

}

</script>

</head>

<body onload="onloadx();" style="">

Hello world!<BR>

</body>

</html>



3.
%%com.webapp.src:/webappsrccheck2.html,/webappsrccheck.html%%
と記述した場合

webapps/src/default.cssのスタイル指定が効く
<!DOCTYPE html><!--ESCAPEPROCESS-->

<head>

<script>

function onloadx() {

//一般関数 コメント変更

console.log( "文字列変更" );

行追加

}

function Class1() {

//クラス コメント変更

console.log( "文字列変更" );

行追加

}

Class1.prototype.method1 = function() {

//メソッド コメント変更

console.log( "文字列変更" );

行追加

}

</script>

</head>

<body onload="onloadx();文字列変更" style="">

Hello world!<BR>

HTML追加

</body>

</html>



4. <code>
%%com.webapp.src:/webappsrccheck2.html,/webappsrccheck.html%%</code>
と記述した場合

このファイルのcodeのスタイル指定が効く
<!DOCTYPE html><!--ESCAPEPROCESS-->

<head>

<script>

function onloadx() {

//一般関数 コメント変更

console.log( "文字列変更" );

行追加

}

function Class1() {

//クラス コメント変更

console.log( "文字列変更" );

行追加

}

Class1.prototype.method1 = function() {

//メソッド コメント変更

console.log( "文字列変更" );

行追加

}

</script>

</head>

<body onload="onloadx();文字列変更" style="">

Hello world!<BR>

HTML追加

</body>

</html>



5. リンクで
src?webappsrccheck.html
と記述した場合

webapps/src/default.cssのスタイル指定が効く
開く

6. リンクで
src?webappsrccheck2.html,webappsrccheck.html
と記述した場合

webapps/src/default.cssのスタイル指定が効く
開く